/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.beansjsf.cadastro;

import br.com.saber.certificacao.beansjsf.interfacebean.BeanJSFInterface;
import br.com.saber.certificacao.beansjsf.login.LoginManager;
import br.com.saber.certificacao.beansjsf.semescopo.SelectItemManager;
import br.com.saber.certificacao.ejbs.stateless.interfaces.CertificacaoBeanLocal;
import br.com.saber.certificacao.ejbs.stateless.interfaces.QuestaoBeanLocal;
import br.com.saber.certificacao.modelos.Certificacao;
import br.com.saber.certificacao.modelos.Questao;
import br.com.saber.certificacao.modelos.Versao;
import br.com.saber.certificacao.modelos.relacionamentos.VersaoQuestao;
import br.com.saber.certificacao.modelos.validadores.exceptions.generica.ValidacaoExcecao;
import br.com.saber.certificacao.observador.ControleObserver;
import br.com.saber.certificacao.utils.UtilMetodos;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author gbvbahia
 */
@ManagedBean(name = "cadastroQuestaoVersao")
@ViewScoped
public class QuestaoVersaoManager implements BeanJSFInterface, Observer {

    @EJB
    private CertificacaoBeanLocal certificacaoBean;

    @EJB
    private QuestaoBeanLocal questaoBean;

    private Questao questaoManipulada;

    private List<Questao> questoesModel;

    private Certificacao certificacaoQuestao;

    private List<Versao> versoesSelecionadas;


    @ManagedProperty("#{loginManager}")
    private LoginManager loginManager;

    @ManagedProperty("#{selectItemManager}")
    private SelectItemManager selectItemManager;

    /** Creates a new instance of QuestaoVersaoManager */
    public QuestaoVersaoManager() {
    }

    //====================
    // Iniciadores
    //====================
    @Override
    @PostConstruct
    public void init() {
        clean(true);
        ControleObserver.addBeanObserver(loginManager.getUsuario(), this);
        Logger.getLogger(this.getClass().getName()).log(Level.FINEST, "QuestaoVersaoManager.init() executado!");
    }

    @Override
    @PreDestroy
    public void end() {
        ControleObserver.removeBeanObserver(loginManager.getUsuario(), this);
        Logger.getLogger(this.getClass().getName()).log(Level.FINEST, "QuestaoVersaoManager.end() executado!");
    }

    //====================
    //Métodos de Negócio
    //====================
    public void salvarQuestao(ActionEvent event) {
        try {
            this.questaoBean.salvarQuestao(questaoManipulada, versoesSelecionadas);
            clean(true);
            ControleObserver.notificaObservers(this.loginManager.getUsuario(), new String[]{ControleObserver.Eventos.CAD_QUESTAO_EVENT});
            UtilMetodos.messageFactoringFull("questaoCadastradaOK", FacesMessage.SEVERITY_INFO, FacesContext.getCurrentInstance());
        } catch (ValidacaoExcecao e) {
            if (!StringUtils.isBlank(e.getAtributoName())) {
                UtilMetodos.messageFactoringFull(UtilMetodos.getResourceBundle(e.getMessage(), FacesContext.getCurrentInstance()), null, e.getAtributoName(), FacesMessage.SEVERITY_ERROR, FacesContext.getCurrentInstance());
            } else {
                UtilMetodos.messageFactoringFull(e.getMessage(), FacesMessage.SEVERITY_ERROR, FacesContext.getCurrentInstance());
            }
        }
    }

    private void clean(boolean nuable) {
        versoesSelecionadas = new ArrayList<Versao>();
        if(nuable){
        questaoManipulada = null;
        certificacaoQuestao = null;
        }
    }

    public void atualizarModel(ActionEvent event) {
        List<Questao> listAux = new ArrayList<Questao>(questaoBean.buscarQuestoesPorUsuario(this.loginManager.getUsuario(), true, true));
        this.questoesModel = new ArrayList<Questao>(listAux);
    }

    @Override
    public void update(Observable o, Object arg) {
        String[] args = (String[]) arg;
        for (int i = 0; i < args.length; i++) {
            if (args[i].equals(ControleObserver.Eventos.CAD_QUESTAO_EVENT)) {
                atualizarModel(null);
            }
        }
    }
    //====================
    //Table Actions
    //====================
    private void pegarQuestao(ActionEvent event) {
        clean(false);
        this.certificacaoQuestao = this.certificacaoBean.buscarCertificacaoPorQuestao(questaoManipulada);
        this.versoesSelecionadas = new ArrayList<Versao>();
        for(VersaoQuestao vq : questaoManipulada.getVersoesDestaQuestao()){
            this.versoesSelecionadas.add(vq.getVersao());
        }
    }
    
    //====================
    //SelectItem
    //====================
    public List<String> shooser(String like){
         return this.selectItemManager.shooser(like, certificacaoQuestao);
     }
    
    public List<SelectItem> getVersoesItem(){
        return this.selectItemManager.getVersoes(this.loginManager.getUsuario(), certificacaoQuestao, false);
    }

    public List<SelectItem> getLinguagens(){
        return this.selectItemManager.getLinguagens();
    }
    
    public List<SelectItem> getTipoQuestoes(){
        return this.selectItemManager.getTipoQuestoes();
    }
    //=========================
    //Getters AND Setters
    //=========================
    public LoginManager getLoginManager() {
        return loginManager;
    }

    public void setLoginManager(LoginManager loginManager) {
        this.loginManager = loginManager;
    }

    public SelectItemManager getSelectItemManager() {
        return selectItemManager;
    }

    public void setSelectItemManager(SelectItemManager selectItemManager) {
        this.selectItemManager = selectItemManager;
    }

    public Questao getQuestaoManipulada() {
        return questaoManipulada;
    }

    public void setQuestaoManipulada(Questao questaoManipulada) {
        this.questaoManipulada = questaoManipulada;
        pegarQuestao(null);
    }

    public List<Questao> getQuestoesModel() {
        if(questoesModel == null){
            atualizarModel(null);
        }
        return questoesModel;
    }

    public void setQuestoesModel(List<Questao> questoesModel) {
        this.questoesModel = questoesModel;
    }

    public Certificacao getCertificacaoQuestao() {
        return certificacaoQuestao;
    }

    public void setCertificacaoQuestao(Certificacao certificacaoQuestao) {
        this.certificacaoQuestao = certificacaoQuestao;
    }

    public List<Versao> getVersoesSelecionadas() {
        return versoesSelecionadas;
    }

    public void setVersoesSelecionadas(List<Versao> versoesSelecionadas) {
        this.versoesSelecionadas = versoesSelecionadas;
    }
}
